home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / mesa / mesa-tk / samples.tk / shape.c < prev    next >
C/C++ Source or Header  |  2000-02-23  |  6KB  |  272 lines

  1. /*
  2.  * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name of
  8.  * Silicon Graphics may not be used in any advertising or
  9.  * publicity relating to the software without the specific, prior written
  10.  * permission of Silicon Graphics.
  11.  *
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13.  * ANY KIND,
  14.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16.  *
  17.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  18.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28. #include "gltk.h"
  29.  
  30. #define OPENGL_WIDTH 24
  31. #define OPENGL_HEIGHT 13
  32.  
  33. GLenum rgb, doubleBuffer, directRender, windType;
  34. GLint objectIndex = 0;
  35. GLuint bases[20];
  36. float angleX = 0.0, angleY = 0.0, angleZ = 0.0;
  37. float scaleX = 1.0, scaleY = 1.0, scaleZ = 1.0;
  38. float shiftX = 0.0, shiftY = 0.0, shiftZ = 0.0;
  39.  
  40. static void Init(void)
  41. {
  42.  
  43.   bases[0] = glGenLists(1);
  44.   tkWireSphere(bases[0], 5.0);
  45.   bases[1] = glGenLists(1);
  46.   tkSolidSphere(bases[1], 5.0);
  47.   bases[2] = glGenLists(1);
  48.   tkWireCube(bases[2], 5.0);
  49.   bases[3] = glGenLists(1);
  50.   tkSolidCube(bases[3], 5.0);
  51.   bases[4] = glGenLists(1);
  52.   tkWireBox(bases[4], 4.0, 5.0, 6.0);
  53.   bases[5] = glGenLists(1);
  54.   tkSolidBox(bases[5], 4.0, 5.0, 6.0);
  55.   bases[6] = glGenLists(1);
  56.   tkWireTorus(bases[6], 5.0, 5.0);
  57.   bases[7] = glGenLists(1);
  58.   tkSolidTorus(bases[7], 5.0, 5.0);
  59.   bases[8] = glGenLists(1);
  60.   tkWireCylinder(bases[8], 5.0, 5.0);
  61.   bases[9] = glGenLists(1);
  62.   tkSolidCylinder(bases[9], 5.0, 5.0);
  63.   bases[10] = glGenLists(1);
  64.   tkWireCone(bases[10], 5.0, 5.0);
  65.   bases[11] = glGenLists(1);
  66.   tkSolidCone(bases[11], 5.0, 5.0);
  67.  
  68.   glClearColor(0.0, 0.0, 0.0, 0.0);
  69.   glClearIndex(0.0);
  70. }
  71.  
  72. static void Reshape(int width, int height)
  73. {
  74.  
  75.   glViewport(0, 0, (GLint) width, (GLint) height);
  76.  
  77.   glMatrixMode(GL_PROJECTION);
  78.   glLoadIdentity();
  79.   glOrtho(-400.0, 400.0, -200.0, 200.0, -400.0, 400.0);
  80.   glMatrixMode(GL_MODELVIEW);
  81. }
  82.  
  83. static GLenum Key(int key, GLenum mask)
  84. {
  85.  
  86.   switch (key) {
  87.     case TK_ESCAPE:
  88.       tkQuit();
  89.  
  90.     case TK_SPACE:
  91.       objectIndex++;
  92.       if (objectIndex > 11) {
  93.     objectIndex = 0;
  94.       }
  95.       break;
  96.  
  97.     case TK_LEFT:
  98.       shiftX -= 20.0;
  99.       break;
  100.     case TK_RIGHT:
  101.       shiftX += 20.0;
  102.       break;
  103.     case TK_UP:
  104.       shiftY += 20.0;
  105.       break;
  106.     case TK_DOWN:
  107.       shiftY -= 20.0;
  108.       break;
  109.     case TK_n:
  110.       shiftZ += 20.0;
  111.       break;
  112.     case TK_m:
  113.       shiftZ -= 20.0;
  114.       break;
  115.  
  116.     case TK_q:
  117.       scaleX -= 0.1;
  118.       if (scaleX < 0.1) {
  119.     scaleX = 0.1;
  120.       }
  121.       break;
  122.     case TK_w:
  123.       scaleX += 0.1;
  124.       break;
  125.     case TK_a:
  126.       scaleY -= 0.1;
  127.       if (scaleY < 0.1) {
  128.     scaleY = 0.1;
  129.       }
  130.       break;
  131.     case TK_s:
  132.       scaleY += 0.1;
  133.       break;
  134.     case TK_z:
  135.       scaleZ -= 0.1;
  136.       if (scaleZ < 0.1) {
  137.     scaleZ = 0.1;
  138.       }
  139.       break;
  140.     case TK_x:
  141.       scaleZ += 0.1;
  142.       break;
  143.  
  144.     case TK_e:
  145.       angleX -= 5.0;
  146.       if (angleX < 0.0) {
  147.     angleX = 360.0 + angleX;
  148.       }
  149.       break;
  150.     case TK_r:
  151.       angleX += 5.0;
  152.       if (angleX > 360.0) {
  153.     angleX = angleX - 360.0;
  154.       }
  155.       break;
  156.     case TK_d:
  157.       angleY -= 5.0;
  158.       if (angleY < 0.0) {
  159.     angleY = 360.0 + angleY;
  160.       }
  161.       break;
  162.     case TK_f:
  163.       angleY += 5.0;
  164.       if (angleY > 360.0) {
  165.     angleY = angleY - 360.0;
  166.       }
  167.       break;
  168.     case TK_c:
  169.       angleZ -= 5.0;
  170.       if (angleZ < 0.0) {
  171.     angleZ = 360.0 + angleZ;
  172.       }
  173.       break;
  174.     case TK_v:
  175.       angleZ += 5.0;
  176.       if (angleZ > 360.0) {
  177.     angleZ = angleZ - 360.0;
  178.       }
  179.       break;
  180.     default:
  181.       return GL_FALSE;
  182.   }
  183.   return GL_TRUE;
  184. }
  185.  
  186. static void Draw(void)
  187. {
  188.  
  189.   glClear(GL_COLOR_BUFFER_BIT);
  190.  
  191.   TK_SETCOLOR(windType, TK_WHITE);
  192.  
  193.   glPushMatrix();
  194.  
  195.   glTranslatef(shiftX, shiftY, shiftZ);
  196.   glRotatef(angleX, 1.0, 0.0, 0.0);
  197.   glRotatef(angleY, 0.0, 1.0, 0.0);
  198.   glRotatef(angleZ, 0.0, 0.0, 1.0);
  199.   glScalef(scaleX, scaleY, scaleZ);
  200.  
  201.   glCallList(bases[objectIndex]);
  202.   glPopMatrix();
  203.  
  204.   glFlush();
  205.  
  206.   if (doubleBuffer) {
  207.     tkSwapBuffers();
  208.   }
  209. }
  210.  
  211. static GLenum Args(int argc, char **argv)
  212. {
  213.   GLint i;
  214.  
  215.   rgb = GL_TRUE;
  216.   doubleBuffer = GL_FALSE;
  217.   directRender = GL_TRUE;
  218.  
  219.   for (i = 1; i < argc; i++) {
  220.     if (strcmp(argv[i], "-ci") == 0) {
  221.       rgb = GL_FALSE;
  222.     }
  223.     else if (strcmp(argv[i], "-rgb") == 0) {
  224.       rgb = GL_TRUE;
  225.     }
  226.     else if (strcmp(argv[i], "-sb") == 0) {
  227.       doubleBuffer = GL_FALSE;
  228.     }
  229.     else if (strcmp(argv[i], "-db") == 0) {
  230.       doubleBuffer = GL_TRUE;
  231.     }
  232.     else if (strcmp(argv[i], "-dr") == 0) {
  233.       directRender = GL_TRUE;
  234.     }
  235.     else if (strcmp(argv[i], "-ir") == 0) {
  236.       directRender = GL_FALSE;
  237.     }
  238.     else {
  239.       printf("%s (Bad option).\n", argv[i]);
  240.       return GL_FALSE;
  241.     }
  242.   }
  243.   return GL_TRUE;
  244. }
  245.  
  246. void main(int argc, char **argv)
  247. {
  248.  
  249.   if (Args(argc, argv) == GL_FALSE) {
  250.     tkQuit();
  251.   }
  252.  
  253.   tkInitPosition(0, 0, 400, 400);
  254.  
  255.   windType = (rgb) ? TK_RGB : TK_INDEX;
  256.   windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  257.   windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  258.   tkInitDisplayMode(windType);
  259.  
  260.   if (tkInitWindow("Font Test") == GL_FALSE) {
  261.     tkQuit();
  262.   }
  263.  
  264.   Init();
  265.  
  266.   tkExposeFunc(Reshape);
  267.   tkReshapeFunc(Reshape);
  268.   tkKeyDownFunc(Key);
  269.   tkDisplayFunc(Draw);
  270.   tkExec();
  271. }
  272.